Tarea 1¶
En este ocasión useré la misma base
In [5]:
import pandas as pd
linkData="https://github.com/SocialAnalytics-StrategicIntelligence/TableOperations/raw/main/dengue_ok.pkl"
dengue = pd.read_pickle(linkData)
# checking format
dengue.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 501236 entries, 0 to 501235 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 departamento 501236 non-null object 1 provincia 501236 non-null object 2 distrito 501236 non-null object 3 ano 501236 non-null int64 4 semana 501236 non-null int64 5 sexo 501236 non-null object 6 edad 501236 non-null int64 7 enfermedad 501236 non-null category 8 case 501236 non-null int64 dtypes: category(1), int64(4), object(4) memory usage: 31.1+ MB
In [6]:
# descripción
dengue.describe().apply(lambda s: s.apply('{0:.5f}'.format))
Out[6]:
| ano | semana | edad | case | |
|---|---|---|---|---|
| count | 501236.00000 | 501236.00000 | 501236.00000 | 501236.00000 |
| mean | 2014.77213 | 21.99838 | 28.96143 | 1.00000 |
| std | 6.14646 | 14.76658 | 18.15954 | 0.00000 |
| min | 2000.00000 | 1.00000 | 0.00000 | 1.00000 |
| 25% | 2011.00000 | 11.00000 | 15.00000 | 1.00000 |
| 50% | 2016.00000 | 18.00000 | 26.00000 | 1.00000 |
| 75% | 2020.00000 | 32.00000 | 41.00000 | 1.00000 |
| max | 2022.00000 | 53.00000 | 106.00000 | 1.00000 |
In [7]:
#renombrar
dengue['enfermedad_text']=dengue.enfermedad.astype(str)
dengue.replace({'enfermedad_text':{'SIN_SEÑALES':'1_SIN_SEÑALES','ALARMA':'2_ALARMA','GRAVE':'3_GRAVE'}},inplace=True)
In [8]:
# por año
dengue.ano.value_counts(sort=False)
Out[8]:
ano 2000 5557 2001 23526 2002 8086 2003 3349 2004 9547 2005 5640 2006 4022 2007 6344 2008 12824 2009 13407 2010 16842 2011 28084 2012 28505 2013 13092 2015 35816 2014 17234 2016 25160 2017 68279 2018 4698 2019 15287 2020 47932 2021 44791 2022 63214 Name: count, dtype: int64
In [9]:
# grupos edades
binLimits=[0,15,50,110]
theLabels=["a_menor_a_16","b_entre_16y50","c_mayor_a_50"]
dengue["edad_grupos"]=pd.cut(dengue['edad'], include_lowest=True,
bins=binLimits,
labels=theLabels,
ordered=True)
# see
dengue.head()
Out[9]:
| departamento | provincia | distrito | ano | semana | sexo | edad | enfermedad | case | enfermedad_text | edad_grupos | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | HUANUCO | LEONCIO PRADO | LUYANDO | 2000 | 47 | M | 9 | SIN_SEÑALES | 1 | 1_SIN_SEÑALES | a_menor_a_16 |
| 1 | HUANUCO | LEONCIO PRADO | LUYANDO | 2000 | 40 | F | 18 | SIN_SEÑALES | 1 | 1_SIN_SEÑALES | b_entre_16y50 |
| 2 | HUANUCO | LEONCIO PRADO | JOSE CRESPO Y CASTILLO | 2000 | 48 | F | 32 | SIN_SEÑALES | 1 | 1_SIN_SEÑALES | b_entre_16y50 |
| 3 | HUANUCO | LEONCIO PRADO | JOSE CRESPO Y CASTILLO | 2000 | 37 | F | 40 | SIN_SEÑALES | 1 | 1_SIN_SEÑALES | b_entre_16y50 |
| 4 | HUANUCO | LEONCIO PRADO | MARIANO DAMASO BERAUN | 2000 | 42 | M | 16 | SIN_SEÑALES | 1 | 1_SIN_SEÑALES | b_entre_16y50 |
In [10]:
# para tabla
pd.crosstab( dengue.enfermedad_text,dengue.edad_grupos, dropna=False, normalize='columns')
Out[10]:
| edad_grupos | a_menor_a_16 | b_entre_16y50 | c_mayor_a_50 |
|---|---|---|---|
| enfermedad_text | |||
| 1_SIN_SEÑALES | 0.876868 | 0.890247 | 0.884549 |
| 2_ALARMA | 0.119010 | 0.105475 | 0.109204 |
| 3_GRAVE | 0.004122 | 0.004278 | 0.006248 |
Análisis semanalmente del año 2017¶
In [11]:
# Filtrar datos para el año 2000
dengue_2000 = dengue[dengue['ano'] == 2000]
# Ver las primeras filas del DataFrame resultante
print(dengue_2000.head())
departamento provincia distrito ano semana sexo \ 0 HUANUCO LEONCIO PRADO LUYANDO 2000 47 M 1 HUANUCO LEONCIO PRADO LUYANDO 2000 40 F 2 HUANUCO LEONCIO PRADO JOSE CRESPO Y CASTILLO 2000 48 F 3 HUANUCO LEONCIO PRADO JOSE CRESPO Y CASTILLO 2000 37 F 4 HUANUCO LEONCIO PRADO MARIANO DAMASO BERAUN 2000 42 M edad enfermedad case enfermedad_text edad_grupos 0 9 SIN_SEÑALES 1 1_SIN_SEÑALES a_menor_a_16 1 18 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50 2 32 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50 3 40 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50 4 16 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50
In [15]:
dengue_2000.enfermedad.value_counts()
Out[15]:
enfermedad SIN_SEÑALES 5557 ALARMA 0 GRAVE 0 Name: count, dtype: int64
Como se observo, en el año 2000 no se registraron casos en "alarma" y "grave", por lo que se analizará el año 2017
In [16]:
# Filtrar datos para el año 2017
dengue_2017 = dengue[dengue['ano'] == 2017]
# Ver las primeras filas del DataFrame resultante
print(dengue_2017.head())
departamento provincia distrito ano semana sexo edad \
257032 AYACUCHO HUANTA LLOCHEGUA 2017 1 M 23
257033 AYACUCHO HUANTA LLOCHEGUA 2017 1 M 31
257034 AYACUCHO HUANTA SIVIA 2017 1 F 40
257035 PIURA SULLANA SULLANA 2017 1 F 23
257036 PIURA SULLANA SULLANA 2017 1 M 13
enfermedad case enfermedad_text edad_grupos
257032 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50
257033 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50
257034 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50
257035 SIN_SEÑALES 1 1_SIN_SEÑALES b_entre_16y50
257036 ALARMA 1 2_ALARMA a_menor_a_16
In [17]:
dengue_2017.enfermedad.value_counts()
Out[17]:
enfermedad SIN_SEÑALES 60381 ALARMA 7664 GRAVE 234 Name: count, dtype: int64
In [12]:
import altair as alt
alt.data_transformers.enable("vegafusion")
Out[12]:
DataTransformerRegistry.enable('vegafusion')
Primer gráfico
In [21]:
# Grafico MEDIA de la edad de todos los casos
alt_dengue_2017 = alt.Chart(dengue_2017)
# Configurar la codificación para el gráfico, utilizando 'semana' en lugar de 'año'
enc_dengue_2017 = alt_dengue_2017.encode(
x='semana:Q', # 'Q' indica datos cuantitativos
y='mean(edad):Q',
color='enfermedad_text:N'
)
grafico = enc_dengue_2017.mark_line() + enc_dengue_2017.mark_errorband()
grafico
Out[21]:
Segundo gráfico
In [23]:
# grafico con la media de las edades, pero seccionados en los 3 grupos
enc_dengue_2017 = alt_dengue_2017.encode(
x='semana:Q', # Eje x para las semanas, cuantitativo
y='median(edad):Q', # Mediana de edad
color='enfermedad_text:N', # Colorear por tipo de enfermedad
tooltip=['median(edad):Q', 'semana:Q'] # Mostrar mediana de edad y semana en el tooltip
).interactive() # Hacer el gráfico interactivo
# Crear un gráfico de líneas con facetas por sexo y edad_grupos
grafico = enc_dengue_2017.mark_line().facet(
row='sexo:N', # Facetas por sexo
column='edad_grupos:N' # Facetas por grupo de edad
)
grafico
Out[23]:
segundo grafico
In [24]:
#graficos de la suma de los casos seccionado en los 3 grupos de edades, la x son las semana
enc_dengue_2017 = alt_dengue_2017.encode(
x='semana:Q', # Eje x para las semanas, cuantitativo
y=alt.Y('sum(case):Q'), # Suma de casos
color='enfermedad_text:N', # Colorear por tipo de enfermedad
tooltip=['sum(case):Q', 'semana:Q'] # Mostrar suma de casos y semana en el tooltip
).interactive() # Hacer el gráfico interactivo
# Crear un gráfico de líneas con facetas por sexo y edad_grupos
grafico = enc_dengue_2017.mark_line().facet(
row='sexo:N', # Facetas por sexo
column='edad_grupos:N' # Facetas por grupo de edad
)
# Mostrar el gráfico
grafico
Out[24]:
tercer gráfico
In [26]:
# como el anterior, pero con log en la Y
enc_dengue_2017 = alt_dengue_2017.encode(
x='semana:Q',
y=alt.Y('sum(case):Q', scale=alt.Scale(type='log')),
color='enfermedad_text:N',
tooltip=['sum(case):Q','semana:Q']
).interactive()
enc_dengue_2017.mark_line().facet(
row='sexo:N',
column='edad_grupos:N'
)
Out[26]:
In [28]:
# tabla
indexList=['edad_grupos','semana','sexo','enfermedad_text']
aggregator={'edad': ['median']}
LevelByYear_2017_medians=dengue_2017.groupby(indexList,observed=True).agg(aggregator)
LevelByYear_2017_medians
Out[28]:
| edad | ||||
|---|---|---|---|---|
| median | ||||
| edad_grupos | semana | sexo | enfermedad_text | |
| a_menor_a_16 | 1 | F | 1_SIN_SEÑALES | 9.0 |
| 2_ALARMA | 6.0 | |||
| M | 1_SIN_SEÑALES | 11.0 | ||
| 2_ALARMA | 12.5 | |||
| 3_GRAVE | 11.0 | |||
| ... | ... | ... | ... | ... |
| c_mayor_a_50 | 52 | F | 1_SIN_SEÑALES | 68.0 |
| 2_ALARMA | 63.0 | |||
| M | 1_SIN_SEÑALES | 59.5 | ||
| 2_ALARMA | 62.0 | |||
| 3_GRAVE | 69.0 |
726 rows × 1 columns
In [29]:
LevelByYear_2017_medians.unstack(['sexo','enfermedad_text'])
Out[29]:
| edad | |||||||
|---|---|---|---|---|---|---|---|
| median | |||||||
| sexo | F | M | |||||
| enfermedad_text | 1_SIN_SEÑALES | 2_ALARMA | 3_GRAVE | 1_SIN_SEÑALES | 2_ALARMA | 3_GRAVE | |
| edad_grupos | semana | ||||||
| a_menor_a_16 | 1 | 9.0 | 6.0 | NaN | 11.0 | 12.5 | 11.0 |
| 2 | 13.0 | 12.5 | NaN | 10.0 | 12.0 | 5.0 | |
| 3 | 9.0 | 11.0 | NaN | 9.0 | 11.0 | 4.0 | |
| 4 | 10.0 | 12.0 | NaN | 11.0 | 4.0 | NaN | |
| 5 | 9.0 | 7.0 | NaN | 11.0 | 12.0 | NaN | |
| ... | ... | ... | ... | ... | ... | ... | ... |
| c_mayor_a_50 | 48 | 63.0 | 57.0 | 61.0 | 56.0 | 64.0 | NaN |
| 49 | 65.0 | 65.0 | NaN | 64.0 | NaN | 81.0 | |
| 50 | 63.0 | NaN | NaN | 57.0 | 56.0 | NaN | |
| 51 | 58.0 | 75.0 | NaN | 59.0 | 73.0 | NaN | |
| 52 | 68.0 | 63.0 | NaN | 59.5 | 62.0 | 69.0 | |
156 rows × 6 columns
In [30]:
# mmmm
LevelByYear_2017_medians.info()
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 726 entries, ('a_menor_a_16', np.int64(1), 'F', '1_SIN_SEÑALES') to ('c_mayor_a_50', np.int64(52), 'M', '3_GRAVE')
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 (edad, median) 726 non-null float64
dtypes: float64(1)
memory usage: 9.3+ KB
cuarto grafico
In [32]:
# grafico puntitos de la suma de casos seccionado en Sinseñales, Alarma y Grave
alt_dengue_2017=alt.Chart(dengue)
enc_dengue_2017=alt_dengue_2017.encode(
x='semana:Q',
y=alt.Y('sum(case):Q', scale=alt.Scale(type='log')),
column='enfermedad_text:N'
)
enc_dengue_2017.mark_circle()
Out[32]:
quinto grafico
In [33]:
# en vez de puntos lineas
alt_dengue_2017 = alt.Chart(dengue_2017)
enc_dengue_2017 = alt_dengue_2017.encode(
x='semana:Q', # Eje x para las semanas, cuantitativo
y=alt.Y('sum(case):Q', scale=alt.Scale(type='log')), # Suma de casos en escala logarítmica
column='enfermedad_text:N' # Crear columnas por tipo de enfermedad
)
enc_dengue_2017.mark_rule()
Out[33]:
sexto grafico
In [35]:
# lo mismo
alt_dengue_2017 = alt.Chart(dengue_2017)
enc_dengue_2017 = alt_dengue_2017.encode(
x='semana:Q',
y=alt.Y('sum(case):Q', scale=alt.Scale(type='log')), # Suma de casos en escala logarítmica
column='enfermedad_text:N' # Crear columnas por tipo de enfermedad
)
enc_dengue_2017.mark_bar() # aca es bar
Out[35]:
In [43]:
# tabla aggregation
indexList=['edad_grupos','semana','sexo','enfermedad_text']
aggregator={'edad': ['median','mean','min','max']}
LevelSemanal_2017_statsFull=dengue_2017.groupby(indexList,observed=True).agg(aggregator)
LevelSemanal_2017_statsFull
Out[43]:
| edad | |||||||
|---|---|---|---|---|---|---|---|
| median | mean | min | max | ||||
| edad_grupos | semana | sexo | enfermedad_text | ||||
| a_menor_a_16 | 1 | F | 1_SIN_SEÑALES | 9.0 | 8.750000 | 1 | 15 |
| 2_ALARMA | 6.0 | 7.111111 | 2 | 14 | |||
| M | 1_SIN_SEÑALES | 11.0 | 9.684211 | 1 | 15 | ||
| 2_ALARMA | 12.5 | 10.125000 | 2 | 14 | |||
| 3_GRAVE | 11.0 | 11.000000 | 11 | 11 | |||
| ... | ... | ... | ... | ... | ... | ... | ... |
| c_mayor_a_50 | 52 | F | 1_SIN_SEÑALES | 68.0 | 66.375000 | 51 | 78 |
| 2_ALARMA | 63.0 | 62.666667 | 54 | 71 | |||
| M | 1_SIN_SEÑALES | 59.5 | 63.666667 | 51 | 87 | ||
| 2_ALARMA | 62.0 | 62.333333 | 57 | 68 | |||
| 3_GRAVE | 69.0 | 69.000000 | 69 | 69 | |||
726 rows × 4 columns
In [45]:
#tabla en formato ..
LevelSemanal_2017_statsFull.stack(future_stack=True)
Out[45]:
| edad | |||||
|---|---|---|---|---|---|
| edad_grupos | semana | sexo | enfermedad_text | ||
| a_menor_a_16 | 1 | F | 1_SIN_SEÑALES | median | 9.00 |
| mean | 8.75 | ||||
| min | 1.00 | ||||
| max | 15.00 | ||||
| 2_ALARMA | median | 6.00 | |||
| ... | ... | ... | ... | ... | ... |
| c_mayor_a_50 | 52 | M | 2_ALARMA | max | 68.00 |
| 3_GRAVE | median | 69.00 | |||
| mean | 69.00 | ||||
| min | 69.00 | ||||
| max | 69.00 |
2904 rows × 1 columns
Mining location para el año 2017¶
In [46]:
indexList=['semana','departamento','provincia','enfermedad_text']
aggregator={'case':['sum']}
semanalPlace_2017=dengue_2017.groupby(indexList,observed=True).agg(aggregator)
semanalPlace_2017
Out[46]:
| case | ||||
|---|---|---|---|---|
| sum | ||||
| semana | departamento | provincia | enfermedad_text | |
| 1 | AYACUCHO | HUANTA | 1_SIN_SEÑALES | 9 |
| 2_ALARMA | 2 | |||
| LA MAR | 1_SIN_SEÑALES | 5 | ||
| 2_ALARMA | 2 | |||
| CAJAMARCA | CONTUMAZA | 1_SIN_SEÑALES | 16 | |
| ... | ... | ... | ... | ... |
| 52 | PIURA | MORROPON | 1_SIN_SEÑALES | 1 |
| PIURA | 1_SIN_SEÑALES | 13 | ||
| SULLANA | 1_SIN_SEÑALES | 9 | ||
| UCAYALI | CORONEL PORTILLO | 1_SIN_SEÑALES | 23 | |
| 2_ALARMA | 3 |
2626 rows × 1 columns
In [48]:
# tabla en wide
semanalPlace_2017.unstack()
Out[48]:
| case | |||||
|---|---|---|---|---|---|
| sum | |||||
| enfermedad_text | 1_SIN_SEÑALES | 2_ALARMA | 3_GRAVE | ||
| semana | departamento | provincia | |||
| 1 | AYACUCHO | HUANTA | 9.0 | 2.0 | NaN |
| LA MAR | 5.0 | 2.0 | NaN | ||
| CAJAMARCA | CONTUMAZA | 16.0 | NaN | NaN | |
| CUSCO | LA CONVENCION | 18.0 | 3.0 | NaN | |
| HUANUCO | LEONCIO PRADO | 1.0 | NaN | NaN | |
| ... | ... | ... | ... | ... | ... |
| 52 | MADRE DE DIOS | TAMBOPATA | 33.0 | 21.0 | 2.0 |
| PIURA | MORROPON | 1.0 | NaN | NaN | |
| PIURA | 13.0 | NaN | NaN | ||
| SULLANA | 9.0 | NaN | NaN | ||
| UCAYALI | CORONEL PORTILLO | 23.0 | 3.0 | NaN | |
1795 rows × 3 columns
In [51]:
# no missing values
semanalPlace_wide_2017=semanalPlace_2017.unstack().fillna(0)
semanalPlace_wide_2017
Out[51]:
| case | |||||
|---|---|---|---|---|---|
| sum | |||||
| enfermedad_text | 1_SIN_SEÑALES | 2_ALARMA | 3_GRAVE | ||
| semana | departamento | provincia | |||
| 1 | AYACUCHO | HUANTA | 9.0 | 2.0 | 0.0 |
| LA MAR | 5.0 | 2.0 | 0.0 | ||
| CAJAMARCA | CONTUMAZA | 16.0 | 0.0 | 0.0 | |
| CUSCO | LA CONVENCION | 18.0 | 3.0 | 0.0 | |
| HUANUCO | LEONCIO PRADO | 1.0 | 0.0 | 0.0 | |
| ... | ... | ... | ... | ... | ... |
| 52 | MADRE DE DIOS | TAMBOPATA | 33.0 | 21.0 | 2.0 |
| PIURA | MORROPON | 1.0 | 0.0 | 0.0 | |
| PIURA | 13.0 | 0.0 | 0.0 | ||
| SULLANA | 9.0 | 0.0 | 0.0 | ||
| UCAYALI | CORONEL PORTILLO | 23.0 | 3.0 | 0.0 | |
1795 rows × 3 columns
In [52]:
#
sumCases=semanalPlace_wide_2017.sum(axis=1)
sumCases
Out[52]:
semana departamento provincia
1 AYACUCHO HUANTA 11.0
LA MAR 7.0
CAJAMARCA CONTUMAZA 16.0
CUSCO LA CONVENCION 21.0
HUANUCO LEONCIO PRADO 1.0
...
52 MADRE DE DIOS TAMBOPATA 56.0
PIURA MORROPON 1.0
PIURA 13.0
SULLANA 9.0
UCAYALI CORONEL PORTILLO 26.0
Length: 1795, dtype: float64
In [53]:
# para ver el peor lugar!
shareAlarma=semanalPlace_wide_2017.loc[:,('case','sum','2_ALARMA')]/sumCases
shareAlarma.name='shareAlarma'
shareAlarma
Out[53]:
semana departamento provincia
1 AYACUCHO HUANTA 0.181818
LA MAR 0.285714
CAJAMARCA CONTUMAZA 0.000000
CUSCO LA CONVENCION 0.142857
HUANUCO LEONCIO PRADO 0.000000
...
52 MADRE DE DIOS TAMBOPATA 0.375000
PIURA MORROPON 0.000000
PIURA 0.000000
SULLANA 0.000000
UCAYALI CORONEL PORTILLO 0.115385
Name: shareAlarma, Length: 1795, dtype: float64
In [54]:
# tablaaa
shareAlarma=shareAlarma.reset_index()
shareAlarma
Out[54]:
| semana | departamento | provincia | shareAlarma | |
|---|---|---|---|---|
| 0 | 1 | AYACUCHO | HUANTA | 0.181818 |
| 1 | 1 | AYACUCHO | LA MAR | 0.285714 |
| 2 | 1 | CAJAMARCA | CONTUMAZA | 0.000000 |
| 3 | 1 | CUSCO | LA CONVENCION | 0.142857 |
| 4 | 1 | HUANUCO | LEONCIO PRADO | 0.000000 |
| ... | ... | ... | ... | ... |
| 1790 | 52 | MADRE DE DIOS | TAMBOPATA | 0.375000 |
| 1791 | 52 | PIURA | MORROPON | 0.000000 |
| 1792 | 52 | PIURA | PIURA | 0.000000 |
| 1793 | 52 | PIURA | SULLANA | 0.000000 |
| 1794 | 52 | UCAYALI | CORONEL PORTILLO | 0.115385 |
1795 rows × 4 columns
In [55]:
# peor provincia por región en semanas
where = shareAlarma.groupby(['semana','departamento'])['shareAlarma'].idxmax()
worst_prov_semana = shareAlarma.loc[where].reset_index(drop=True)
worst_prov_semana
Out[55]:
| semana | departamento | provincia | shareAlarma | |
|---|---|---|---|---|
| 0 | 1 | AYACUCHO | LA MAR | 0.285714 |
| 1 | 1 | CAJAMARCA | CONTUMAZA | 0.000000 |
| 2 | 1 | CUSCO | LA CONVENCION | 0.142857 |
| 3 | 1 | HUANUCO | LEONCIO PRADO | 0.000000 |
| 4 | 1 | ICA | PALPA | 0.000000 |
| ... | ... | ... | ... | ... |
| 752 | 52 | LIMA | LIMA | 1.000000 |
| 753 | 52 | LORETO | REQUENA | 1.000000 |
| 754 | 52 | MADRE DE DIOS | TAMBOPATA | 0.375000 |
| 755 | 52 | PIURA | MORROPON | 0.000000 |
| 756 | 52 | UCAYALI | CORONEL PORTILLO | 0.115385 |
757 rows × 4 columns
In [57]:
# descriptivo de los peores
worst_prov_semana.shareAlarma.describe()
Out[57]:
count 757.000000 mean 0.240214 std 0.330670 min 0.000000 25% 0.000000 50% 0.062500 75% 0.375000 max 1.000000 Name: shareAlarma, dtype: float64
In [58]:
# cantidad de peores casos por prov por region
len(worst_prov_semana.provincia.value_counts())
Out[58]:
65
el de la clase es 79
In [59]:
# amount of worst provinces per region - cleaner
len(worst_prov_semana[worst_prov_semana.shareAlarma>0].provincia.value_counts())
Out[59]:
62
el de la clase es 74
In [60]:
# sharealarma > 0
worst_ProvSemana_alarma=worst_prov_semana[worst_prov_semana.shareAlarma>0].loc[:,['departamento','provincia']]
worst_ProvSemana_alarma.reset_index(drop=True,inplace=True)
worst_ProvSemana_alarma
Out[60]:
| departamento | provincia | |
|---|---|---|
| 0 | AYACUCHO | LA MAR |
| 1 | CUSCO | LA CONVENCION |
| 2 | LA LIBERTAD | CHEPEN |
| 3 | LORETO | MAYNAS |
| 4 | MADRE DE DIOS | TAMBOPATA |
| ... | ... | ... |
| 449 | LA LIBERTAD | TRUJILLO |
| 450 | LIMA | LIMA |
| 451 | LORETO | REQUENA |
| 452 | MADRE DE DIOS | TAMBOPATA |
| 453 | UCAYALI | CORONEL PORTILLO |
454 rows × 2 columns
In [62]:
indexList=['departamento','provincia']
aggregator={'provincia':['count']}
worst_ProvSemana_alarma_Frequency=worst_ProvSemana_alarma.groupby(indexList,observed=True).agg(aggregator)
worst_ProvSemana_alarma_Frequency
Out[62]:
| provincia | ||
|---|---|---|
| count | ||
| departamento | provincia | |
| AMAZONAS | UTCUBAMBA | 2 |
| ANCASH | CASMA | 1 |
| SANTA | 15 | |
| AYACUCHO | HUAMANGA | 1 |
| HUANTA | 17 | |
| ... | ... | ... |
| TUMBES | TUMBES | 12 |
| ZARUMILLA | 5 | |
| UCAYALI | ATALAYA | 18 |
| CORONEL PORTILLO | 17 | |
| PADRE ABAD | 6 |
62 rows × 1 columns
In [63]:
# descriptivo q muestra cuantas semanas una prov fue la mas afectada
worst_ProvSemana_alarma_Frequency.describe()
Out[63]:
| provincia | |
|---|---|
| count | |
| count | 62.000000 |
| mean | 7.322581 |
| std | 7.460880 |
| min | 1.000000 |
| 25% | 2.000000 |
| 50% | 5.000000 |
| 75% | 11.000000 |
| max | 32.000000 |
In [64]:
# final look
worst_ProvSemana_alarma_Frequency.columns=['semanasAffected']
worst_ProvSemana_alarma_Frequency=worst_ProvSemana_alarma_Frequency[worst_ProvSemana_alarma_Frequency.semanasAffected>2]
worst_ProvSemana_alarma_Frequency.reset_index(inplace=True)
worst_ProvSemana_alarma_Frequency
Out[64]:
| departamento | provincia | semanasAffected | |
|---|---|---|---|
| 0 | ANCASH | SANTA | 15 |
| 1 | AYACUCHO | HUANTA | 17 |
| 2 | AYACUCHO | LA MAR | 21 |
| 3 | CUSCO | LA CONVENCION | 27 |
| 4 | HUANUCO | LEONCIO PRADO | 12 |
| 5 | ICA | ICA | 7 |
| 6 | ICA | NAZCA | 3 |
| 7 | ICA | PALPA | 15 |
| 8 | JUNIN | CHANCHAMAYO | 12 |
| 9 | JUNIN | SATIPO | 6 |
| 10 | LA LIBERTAD | ASCOPE | 4 |
| 11 | LA LIBERTAD | CHEPEN | 11 |
| 12 | LA LIBERTAD | PACASMAYO | 6 |
| 13 | LA LIBERTAD | TRUJILLO | 13 |
| 14 | LA LIBERTAD | VIRU | 3 |
| 15 | LAMBAYEQUE | CHICLAYO | 16 |
| 16 | LAMBAYEQUE | LAMBAYEQUE | 4 |
| 17 | LIMA | LIMA | 11 |
| 18 | LORETO | DATEM DEL MARAÑON | 4 |
| 19 | LORETO | LORETO | 5 |
| 20 | LORETO | MAYNAS | 32 |
| 21 | LORETO | REQUENA | 5 |
| 22 | MADRE DE DIOS | MANU | 3 |
| 23 | MADRE DE DIOS | TAHUAMANU | 3 |
| 24 | MADRE DE DIOS | TAMBOPATA | 32 |
| 25 | PIURA | HUANCABAMBA | 5 |
| 26 | PIURA | PAITA | 15 |
| 27 | PIURA | PIURA | 3 |
| 28 | PIURA | SECHURA | 11 |
| 29 | PIURA | SULLANA | 8 |
| 30 | PIURA | TALARA | 5 |
| 31 | SAN MARTIN | HUALLAGA | 3 |
| 32 | SAN MARTIN | MARISCAL CACERES | 10 |
| 33 | SAN MARTIN | MOYOBAMBA | 6 |
| 34 | SAN MARTIN | SAN MARTIN | 6 |
| 35 | SAN MARTIN | TOCACHE | 4 |
| 36 | TUMBES | CONTRALMIRANTE VILLAR | 5 |
| 37 | TUMBES | TUMBES | 12 |
| 38 | TUMBES | ZARUMILLA | 5 |
| 39 | UCAYALI | ATALAYA | 18 |
| 40 | UCAYALI | CORONEL PORTILLO | 17 |
| 41 | UCAYALI | PADRE ABAD | 6 |
septimo grafico
In [66]:
alt_worstProv=alt.Chart(worst_ProvSemana_alarma_Frequency)
enc_worstProv=alt_worstProv.encode(
y='departamento',
x='provincia',
text='semanasAffected:O',
size='semanasAffected:O'
)
enc_worstProv.mark_text()
Out[66]:
In [67]:
#
indexList=['semana','departamento','enfermedad_text']
aggregator={'case':['sum']}
SemanaDepa=dengue_2017.groupby(indexList,observed=True).agg(aggregator)
SemanaDepa_wide=SemanaDepa.unstack().fillna(0)
SemanaDepaAlarm=SemanaDepa_wide.loc[:,('case','sum','2_ALARMA')]/SemanaDepa_wide.sum(axis=1)
SemanaDepaAlarm.name='alarmShare'
SemanaDepaAlarm=SemanaDepaAlarm.reset_index()
SemanaDepaAlarm
Out[67]:
| semana | departamento | alarmShare | |
|---|---|---|---|
| 0 | 1 | AYACUCHO | 0.222222 |
| 1 | 1 | CAJAMARCA | 0.000000 |
| 2 | 1 | CUSCO | 0.142857 |
| 3 | 1 | HUANUCO | 0.000000 |
| 4 | 1 | ICA | 0.000000 |
| ... | ... | ... | ... |
| 752 | 52 | LIMA | 1.000000 |
| 753 | 52 | LORETO | 0.478261 |
| 754 | 52 | MADRE DE DIOS | 0.375000 |
| 755 | 52 | PIURA | 0.000000 |
| 756 | 52 | UCAYALI | 0.115385 |
757 rows × 3 columns
In [68]:
# descriptivoos nievl dep
SemanaDepaAlarm.describe()
Out[68]:
| semana | alarmShare | |
|---|---|---|
| count | 757.000000 | 757.000000 |
| mean | 25.394980 | 0.122590 |
| std | 14.666437 | 0.184344 |
| min | 1.000000 | 0.000000 |
| 25% | 13.000000 | 0.000000 |
| 50% | 24.000000 | 0.040000 |
| 75% | 38.000000 | 0.166667 |
| max | 52.000000 | 1.000000 |
In [69]:
# filtrando mayores a 0
SemanaDepaAlarm_focus=SemanaDepaAlarm[SemanaDepaAlarm.alarmShare>0]
In [70]:
# el descriptivo
SemanaDepaAlarm_focus.describe()
Out[70]:
| semana | alarmShare | |
|---|---|---|
| count | 454.000000 | 454.000000 |
| mean | 22.991189 | 0.204407 |
| std | 14.144942 | 0.199880 |
| min | 1.000000 | 0.003367 |
| 25% | 12.000000 | 0.058824 |
| 50% | 21.000000 | 0.142857 |
| 75% | 34.000000 | 0.285714 |
| max | 52.000000 | 1.000000 |
In [71]:
#
edges=[-1, .10, .25, .5,1]
theLabels=["a.below10%","b.11-25%","c.26-50%","d.above50%"]
SemanaDepaAlarm_focus.loc[:,"alarmLevels"]=pd.cut(SemanaDepaAlarm_focus['alarmShare'],
include_lowest=True,
bins=edges,
labels=theLabels,
ordered=True)
##
SemanaDepaAlarm_focus.head()
C:\Users\YHARA\AppData\Local\Temp\ipykernel_12032\4040302067.py:4: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy SemanaDepaAlarm_focus.loc[:,"alarmLevels"]=pd.cut(SemanaDepaAlarm_focus['alarmShare'],
Out[71]:
| semana | departamento | alarmShare | alarmLevels | |
|---|---|---|---|---|
| 0 | 1 | AYACUCHO | 0.222222 | b.11-25% |
| 2 | 1 | CUSCO | 0.142857 | b.11-25% |
| 6 | 1 | LA LIBERTAD | 1.000000 | d.above50% |
| 7 | 1 | LORETO | 0.153846 | b.11-25% |
| 8 | 1 | MADRE DE DIOS | 0.250000 | b.11-25% |
Octavo grafico
In [80]:
###
#lightgreyred
alt_WorstDepa=alt.Chart(SemanaDepaAlarm_focus).encode(x='semana:O',
y=alt.Y('departamento:N',
sort=alt.EncodingSortField(field='alarmShare',op='max',order='descending')))
enc1_WorstDepa=alt_WorstDepa.encode(
color=alt.Color('alarmLevels:O').scale(scheme="purplebluegreen", reverse=False)
)
enc1_WorstDepa.mark_rect()
Out[80]:
noveno grafico
In [81]:
# el mismo grafico pero sincolores
enc2_WorstDepa=alt_WorstDepa.encode(
text=alt.Text('alarmShare:Q', format=".1f"),
opacity=alt.condition('datum.alarmShare >= 0.3', alt.value(1), alt.value(0)))
enc2_WorstDepa.mark_text(fontStyle='bold')
Out[81]:
decimo grafico
In [82]:
enc1_WorstDepa.mark_rect() + enc2_WorstDepa.mark_text()
Out[82]:
In [ ]: